import java.util.Scanner;

/**
 * 
 * @author victor
 *
 */
public class MezclaListas {
	
	/**
	 * Intercambia dos posiciones de la lista
	 * @param datos int[] lista
	 * @param uno int primer dato de la lista
	 * @param otro int segundo dato de la lista
	 * @return int[] lista con el intercambio realizado
	 */
	private static int[] intercambia(int[] datos, int uno, int otro) {
	    // almacena primer dato
		int temp_fin = datos[uno];
	    // segundo dato se copia al primero
	    datos[uno] = datos[otro];
	    // segundo datos se sobreescribe con el primero
	    datos[otro] = temp_fin;
	    return datos;
	}
	
	/**
	 * Ordenacion de la lista
	 * @param datos int[] lista a ordenar
	 * @param inicio int inicio de la lista
	 * @param fin int fin de la lista
	 * @return int[] lista ordenada
	 */
	private static int[] quicksort(int[] datos, int inicio, int fin) {
		int i = inicio, j = fin;
		// actividad temporal
		int temp = datos[inicio + (fin-inicio)/2];
		// mientras la actividad de inicio sea menor que la de fin
	    while (i <= j) {
	    	// mientras este ordenado se avanza hasta encontrar uno que no este ordenado
	    	while (datos[i] < temp) {
	    		i++;
	    	}  
	    	while (datos[j] > temp) {
	    		j--;
	    	} 
	    	// si no esta ordenado se intercambia valor
	    	if (i <= j) {
	    		datos = intercambia(datos, i++, j--);
	    	}
	    }
	    // ordenar la primera parte
	    if (inicio < j) {
	    	datos = quicksort(datos,inicio, j);
	    }
	    // ordenar la segunda parte
	    if (i < fin) {
	    	datos = quicksort(datos,i, fin);
	    }
	    return datos;
	}	
	
	/**
	 * Reduce las listas mezclando las 2 primeras
	 * @param listas int[] lista a reducir
	 * @param mezcla int valor de las 2 primeras soluciones
	 * @return int[] lista reducida
	 */
	private static int[] reduceLista(int[] listas, int mezcla) {
		// lista nueva a devolver
		int[] lista_temp = new int[ listas.length-1];
		// pasar los datos una posicion menos
		for (int j=0,k=listas.length-2; j<k; k--) {
			lista_temp[k] = listas[k+1];
		}
		// el primer valor es la sumas de los dos primeros valores
		lista_temp[0] = mezcla;
		return lista_temp;
	}
	
	private static int minOperacionesMezcla(int[] listas) {
		// contador de operaciones
		int operaciones = 0;
		// solo una lista
		if ( listas.length == 1) {
			return 0;
		}
		// mas de 1 lista
		else {
			for (int i=0,j=listas.length; i<j && listas.length>=2; i++) {
				//ordenar las listas actuales
				listas = quicksort(listas,0,listas.length-1);
				// mezclar las 2 primeras
				int mezcla = listas[0] + listas[1];
				// contador de operaciones
				operaciones += mezcla;
				// junta las 2 primeras listas, creando una nueva
				listas = reduceLista(listas,mezcla);
			}
			return operaciones;
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		String[] entrada;
		int[] datos;
		int listas;
			
		try {
			// almacena numero de sublistas
			listas = Integer.parseInt( sc.nextLine() );
			datos = new int[ listas ];
			// pide tamano de sublistas
			entrada = sc.nextLine().split(" ");
			for (int i=0,j=entrada.length; i<j; i++){
				datos[i] = Integer.parseInt( entrada[i] );
			}
			// calcular minimo de operaciones de mezcla
			int solucion = minOperacionesMezcla(datos);
			System.out.println( solucion );
			
		} catch (Exception e) {
			System.out.println("");
		}
		
	}

}
